import { db } from "@/db/db";
import { utils } from "@/utils";
import { UserModel } from "@/share/models";

/**
 * 异步函数token用于在请求处理链中验证用户身份。
 * 它通过检查请求头中的"x-token"字段来尝试验证用户身份。
 *
 * @param c Context - 上下文对象，包含请求和响应等信息。
 * @param next Next - 函数，表示后续的请求处理函数。
 * @returns Promise<void> - 表示异步操作的结果。
 */
export async function token(c: Context, next: Next) {
  // 从请求头中尝试获取令牌
  const token = c.headers["x-token"] as string;

  // 如果令牌存在
  if (token) {
    try {
      // 解析令牌，尝试获取其中的用户ID信息
      const tokenObj = utils.TokenManager.parse(token);
      if (tokenObj.id) {
        // 如果令牌中包含用户ID，尝试从数据库中查找该用户
        const user = db.getRepository(UserModel);
        c.user = await user.findOneBy({ id: tokenObj.id });
      }
    } catch {
      // 令牌解析失败时，忽略错误，不进行处理
    }
  }

  await next();
}
